#include <stdio.h>
#include <iostream>
#include "cmake_dll_helloworld.h"

// class HelloWorldClass{

//     public:
//         int mnvar1 = 0;
//         float mfvar2 = 0;//成员变量

//         HelloWorldClass(int var1): mnvar1(var1){};// 构造函数
//         void say_hello();
//         // int user_add(int a, int b);
//         void set_mnvar1(int var1);
//         int get_mnvar1();

//         // void set_mnvar1(float var1);
//         // int get_mnvar1();

// };

void HelloWorldClass::say_hello(){

    std::cout << "HelloWorld::say_hello " << std::endl;

}

// int HelloWorldClass::user_add(int a, int b){
//     int c = a+b;
//     std::cout<< a<<"+"<<b<<"="<< c << std::endl;
//     return c;
// }

void HelloWorldClass::set_mnvar1(int var1){
    // this->mnvar1 = var1;
    // int i = 0;
    mnvar1 = var1;
}

int HelloWorldClass::get_mnvar1(){

    // std::cout << "get_mnvar1 " <<mnvar1 << std::endl;
    return mnvar1;
}

void HelloWorldClass::set_mfvar2(float var2){
    mfvar2 = var2;
}

float HelloWorldClass::get_mfvar2(){

    return mfvar2;
}


void HelloWorldClass::set_msvar3(const std::string& var3){ // 加const
    msvar3 = var3;
}
std::string HelloWorldClass::get_msvar3(){

    return msvar3;
}


/*
int[5] 成员变量
*/
void HelloWorldClass::set_mnvar4s(const int* nvar4s){
    for (int i=0; i<5; i++){
        mnvar4s[i] = nvar4s[i];
    }

}; 

const int* HelloWorldClass::get_mnvar4s(){
    return mnvar4s;
};



/*
 vector 成员变量
*/
void HelloWorldClass::set_mnvar5s(const std::vector<int>& var5s){
    mnvar5s = var5s;
};

const std::vector<int> HelloWorldClass::get_mnvar5s(){
    // std::cout << "get_mnvar5s" << std::endl;
    return mnvar5s;
};

/*
struct
*/
void HelloWorldClass::set_mspoint(SPoint& spoint){
    mspoint.x = spoint.x;
    mspoint.y = spoint.y;

}
SPoint HelloWorldClass::get_mspoint(){
    return mspoint;// =是值传递

};

HelloWorldClass::~HelloWorldClass(){ // 析构
    // Todo 
    std::cout << "RUN  ~HelloWorldClass() " << std::endl;
    // delete &msvar3;
    // delete &mnvar5s;
    delete mnvar6s;

};


void CPPFun() {
    std::cout << "CPPFun " << std::endl;
}


/*
    C 格式
*/
extern "C"{

    // void SayHelloWorld() {
    //     CPPFun();
    //     // std::cout << "get_mnvar2 " << std::endl;
    //     printf("Hello, from cmake_dll_helloworld!\n");
    //     int i=0;
    // }

    void* create_HelloWorldClass(int var1){
        return new HelloWorldClass(var1);
    }

    void HelloWorldClass_say_hello(void* pobj){
        reinterpret_cast<HelloWorldClass*>(pobj)->say_hello();
    }

    void HelloWorldClass_set_mnvar1(void* pobj, int var1){
        reinterpret_cast<HelloWorldClass*>(pobj)->set_mnvar1(var1);
        // int i = 0;
    }

    int HelloWorldClass_get_mnvar1(void* pobj){
        return reinterpret_cast<HelloWorldClass*>(pobj)->get_mnvar1();
    }


    void HelloWorldClass_set_mfvar2(void* pobj, float var2){
        reinterpret_cast<HelloWorldClass*>(pobj)->set_mfvar2(var2);
        // int i = 0;
    }

    float HelloWorldClass_get_mfvar2(void* pobj){
        return reinterpret_cast<HelloWorldClass*>(pobj)->get_mfvar2();
    }

    // 字符串
    void HelloWorldClass_set_msvar3(void* pobj, const char* var3){ // c类型
        std::string var_cpp(var3);// c转c++格式
        reinterpret_cast<HelloWorldClass*>(pobj)->set_msvar3(var_cpp);
    }

     const char* HelloWorldClass_get_msvar3(void* pobj){ // 返回变量放在输入参数上
        std::string varcpp = reinterpret_cast<HelloWorldClass*>(pobj)->get_msvar3();
        // out = varcpp.c_str();
        return varcpp.c_str(); // 返回值 c类型  .c_str()  
    }


    void HelloWorldClass_set_mnvar5s(void* pobj, const int* pvar, size_t size){ // c类型
        std::vector<int> var_cpp(pvar, pvar+size); // c转c++格式
        reinterpret_cast<HelloWorldClass*>(pobj)->set_mnvar5s(var_cpp);
    }

    void HelloWorldClass_get_mnvar5s(void* pobj, int* out){ // c类型

        const std::vector<int> var_cpp = reinterpret_cast<HelloWorldClass*>(pobj)->get_mnvar5s();
        std::copy(var_cpp.begin(), var_cpp.begin() + var_cpp.size(), out); //c++转c格式
    }

    /*
    int[5]
    */
    void HelloWorldClass_get_mnvar4s(void* pobj, int* out){
        const int* var_cpp = reinterpret_cast<HelloWorldClass*>(pobj)->get_mnvar4s(); 
        for (size_t i = 0; i < 5; i++)
        {
            out[i] = var_cpp[i];
        }
        // return out;
    }

    void HelloWorldClass_set_mnvar4s(void* pobj, int* out){
        reinterpret_cast<HelloWorldClass*>(pobj)->set_mnvar4s(out); 

    }

    /*
    struct
    */

   SPoint HelloWorldClass_get_mspoint(void* pobj, int* out){
         return reinterpret_cast<HelloWorldClass*>(pobj)->get_mspoint();//
   }

   void HelloWorldClass_set_mspoint(void* pobj, SPoint sp){
         reinterpret_cast<HelloWorldClass*>(pobj)->set_mspoint(sp);//
   }

    /*析构 清理对象在堆空间的内存*/
    void HelloWorldClass_destory(void* pobj){
        delete reinterpret_cast<HelloWorldClass*>(pobj); // 显式调用，（递归函数）
    }
}